package com.qyb.base.java8.chap3;



import com.qyb.base.java8.bean.Apple;

import java.util.Arrays;
import java.util.List;

import static java.util.Comparator.comparing;

/**
 * *************************************************************************************************
 * <p/>
 * 实现功能：方法引用
 * <p>
 * ------------------------------------------------------------------------------------------------
 * 版本          变更时间             变更人                     变更原因
 * ------------------------------------------------------------------------------------------------
 * 1.0.00      2017/8/8 9:46      秦有宝                     新建
 * <p/>
 * *************************************************************************************************
 */
/*
方法引用让你可以重复使用现有的方法定义，并像Lambda一样传递它们
如何构建方法引用,方法引用主要有三类。
(1) 指向静态方法的方法引用（例如Integer的parseInt方法，写作Integer::parseInt）。
    (args)->ClassName.staticMethod(args)     ClassName::staticMethod
(2) 指向任意类型实例方法的方法引用（例如String的length方法，写作String::length）。
    (arg0, rest)->arg0.instanceMethod(rest)     ClassName::instanceMethod     arg0是ClassName类型
(3) 指向现有对象的实例方法的方法引用（假设你有一个局部变量expensiveTransaction
用于存放Transaction类型的对象，它支持实例方法getValue，那么你就可以写expensive-
Transaction::getValue）。
(args)->expr.instanceMethod(args)      expr::instanceMethod





 */
public class MethodRef {
    public static void demo1(){
        List<Apple> inventory = Arrays.asList(new Apple(80,"green"), new Apple(155, "green"), new Apple(120, "red"), new Apple(120, "green"));
        //inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
        System.out.println(inventory);
        inventory.sort(comparing(Apple::getWeight));              //升序
        System.out.println(inventory);
        inventory.sort(comparing(Apple::getWeight).reversed());   //降序
        System.out.println(inventory);
        inventory.sort(comparing(Apple::getWeight).thenComparing(comparing(Apple::getColor)));//先比较重量，在比较颜色
        System.out.println(inventory);
    }


    public static void demo2(){
        List<String> str = Arrays.asList("a","b","A","B");
        System.out.println(str);
        str.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
        System.out.println(str);

        List<String> str1 = Arrays.asList("a","b","A","B");
        System.out.println(str1);
        str1.sort(String::compareToIgnoreCase);
        System.out.println(str1);
    }


}
